package cn.csc.module.pay.api.order;

import cn.csc.framework.common.pojo.CommonResult;
import cn.csc.module.pay.api.order.dto.*;
import cn.csc.module.pay.enums.ApiConstants;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import javax.annotation.security.PermitAll;
import javax.validation.Valid;
import java.math.BigInteger;

/**
 * 支付单 API 接口
 *
 * @author LeeYan9
 * @since 2022-08-26
 */
@FeignClient(name = ApiConstants.NAME) // TODO fallbackFactory =
@Api("RPC 服务 - 支付单")
public interface PayOrderApi {

    String PREFIX = ApiConstants.PREFIX + "/order";

    /**
     * 创建支付单
     *
     * @param reqDTO 创建请求
     * @return 支付单编号
     */
    @GetMapping(PREFIX + "/create")
    @ApiOperation("创建支付单")
    CommonResult<BigInteger> createOrder(@Valid @RequestBody PayOrderCreateReqDTO reqDTO);

    /**
     * 提交支付单
     *
     * @param reqDTO 创建请求
     * @return 支付单返回数据
     */
    @GetMapping(PREFIX + "/submitOrder")
    @ApiOperation("提交支付单")
    CommonResult<PayOrderSubmitRespDTO> submitOrder(@Valid @RequestBody PayOrderSubmitReqDTO reqDTO);

    /**
     * 获得支付单
     *
     * @param id 支付单编号
     * @return 支付单
     */
    @GetMapping(PREFIX + "/get")
    @ApiOperation("获得支付单")
    @ApiImplicitParam(name = "id", value = "支付单编号", required = true, example = "1660845423438405633")
    @PermitAll
    CommonResult<PayOrderRespDTO> getOrder(BigInteger id);

    /**
     * 创建分账任务
     * @param reqDTO 创建分账任务参数
     * @return
     */
    @PostMapping(PREFIX + "/createDivide")
    @ApiOperation("创建分账任务(支付订单号)")
    CommonResult<Boolean> createDivide(@Valid @RequestBody CreateDivideReqDTO reqDTO);


    /**
     * 创建分账任务(商户订单号+订单项ID)
     * @param reqDTO 创建分账任务参数
     * @return
     */
    @PostMapping(PREFIX + "/createDivideByOrderItemId")
    @ApiOperation("创建分账任务(商户订单号+订单项ID)")
    CommonResult<Boolean> createDivideByOrderItemId(@Valid @RequestBody CreateDivideWithOrderItemIdReqDTO reqDTO);

}
